for برای اجرای تکراری دستورات استفاده میشوند و در آزمونهای LPIC و RHCSA بسیار پرتکرارند.
فرض کن میخوای ۵ بار به کسی «سلام» بگی. بهجای اینکه ۵ بار دستور echo رو تایپ کنی، میتونی با یه حلقه این کار رو اتوماتیک کنی. توی لینوکس، حلقههای for دقیقاً همین کار رو انجام میدن: به اسکریپت شما اجازه میدن یه کار رو تعداد مشخصی بار تکرار کنی. این جلسه بهت یاد میده چطور با for، seq و ترکیبهای مختلف، کارهای تکراری رو خودکار کنی!
در اسکریپتنویسی، خیلی مواقع نیاز داریم که یک دستور یا مجموعهای از دستورات را تعداد مشخصی بار اجرا کنیم. مثلاً:
seq (تولید اعداد متوالی)
seq یک دستور بسیار مفید است که اعداد متوالی را تولید میکند. این دستور معمولاً در حلقههای for برای تعیین تعداد دفعات تکرار استفاده میشود.
seq| فرمت | معنی | مثال |
|---|---|---|
seq N |
اعداد از ۱ تا N | seq 5 → 1 2 3 4 5 |
seq start end |
اعداد از start تا end | seq 10 15 → 10 11 12 13 14 15 |
seq start step end |
اعداد از start تا end با گام step | seq 1 2 10 → 1 3 5 7 9 |
توضیح: seq اعداد را به صورت عمودی (هر عدد در یک خط) چاپ میکند. در حلقههای for از آن برای تولید لیست اعداد استفاده میکنیم.
forنکات مهم:
for با do شروع و با done خاتمه مییابد.$متغیر به مقدار فعلی دسترسی داریم.seq، {1..5} و ... استفاده کنیم.for
توضیح: متغیر i به ترتیب مقادیر ۱ تا ۵ را میگیرد و هر بار پیام چاپ میشود.
seq در حلقه
توضیح: seq 1 2 10 اعداد فرد ۱ تا ۹ را تولید میکند و حلقه روی آنها میچرخد.
$(seq ...) یعنی خروجی seq را به عنوان لیست به حلقه بده. این یک روش بسیار رایج است.
این اسکریپت آیپیهای 192.168.1.1 تا 192.168.1.5 را پینگ میکند.
for و seq برای پینگ کردن محدودههای آیپی بسیار کاربردی است.
توضیح: حلقه روی لیست فایلها میچرخد و هر کدام را به /tmp کپی میکند.
for و timeoutتوضیح: این اسکریپت یک اسکنر پورت ساده است که پورتهای مشخص را روی یک آیپی هدف بررسی میکند.
timeout 1 یعنی حداکثر ۱ ثانیه صبر کن. /dev/tcp/ یک روش داخلی Bash برای اتصال به پورتهاست.
for i in 1 2; do ping -c 1 192.168.1.$i; done;
دستور for i in 1 2; do ping -c 1 192.168.1.$i; done; را تکهتکه بررسی میکنیم:
| بخش | معنی |
|---|---|
for i in 1 2 |
متغیر i به ترتیب مقادیر ۱ و ۲ را میگیرد. |
do |
شروع بدنهٔ حلقه. |
ping -c 1 192.168.1.$i |
آیپی 192.168.1.1 و سپس 192.168.1.2 را پینگ میکند. |
done |
پایان حلقه. |
این دستور معادل اجرای دو دستور زیر است:
seq محدوده را گسترش دهید:
for| روش | مثال | توضیح |
|---|---|---|
| لیست ثابت | for i in 1 2 3 4 5 |
مقادیر را مستقیماً مینویسیم. |
seq |
for i in $(seq 1 10) |
تولید اعداد متوالی با seq. |
| Brace Expansion | for i in {1..10} |
روش کوتاهتر (مشابه seq). |
| خروجی فرمان | for file in $(ls *.txt) |
لیست فایلهای txt. |
| آرایه | for i in "${array[@]}" |
حلقه روی آرایه. |
for → حلقه برای تکرار دستورات با مقادیر مختلف.seq → تولید اعداد متوالی برای استفاده در حلقه.for var in list; do commands; doneseq، {1..10} یا خروجی فرمان باشد.$var → دسترسی به مقدار فعلی متغیر حلقه.if: میتوانید در بدنه حلقه از if هم استفاده کنید.یک اسکریپت بنویسید که:
read از کاربر یک عدد N بگیرد.for و seq اعداد ۱ تا N را چاپ کند.if و %).